//: C19:TypenamedID.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 1999
// Copyright notice in Copyright.txt
// Using 'typename' to say it's a type,
// and not something other than a type

template<class T> class X
{
    // Without typename, you should get an error:
    typename T::id i;
public:
    void f() {
        i.g();
    }
};

class Y
{
public:
    class id
    {
    public:
        void g() {}
    };
};

int main()
{
    Y y;
    X<Y> xy;
    xy.f();
} ///:~
